%     VIRTUAL HC - программа для получения эффективных свойств сотовых заполнителей
%     Copyright (C) 2018-2020  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Properties = Read_Dat_File_Mech(Job_Name, Work_Directory)

global ErrCode;

Properties = [];

% Полный путь к файлу
File_Path = [Work_Directory '\' Job_Name '.dat'];

% Проверка существования файла
if (exist(File_Path, 'file') ~= 2)
    fprintf (1, '\nОшибка: программе не удалось найти файл [%s] !\n', File_Path);
    fprintf (1, 'Возможно, запуск Abaqus завершился неудачей.\n');
    fprintf (1, 'Проверьте файлы расчета с названием [%s] в рабочей папке Abaqus для выяснения причин данной ошибки.\n', Job_Name);
    ErrCode = -1;
    return;
end

% Открытие файла
Fin = fopen(File_Path, 'r');

% Проверка
if (Fin < 0)
    fprintf (1, '\nОшибка функции Read_Dat_File_Mech: не удалось открыть файл [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

% Выделение памяти
Mech_Results = zeros(6,6);
Therm_Results = zeros(1,3);

Mech_Flags = zeros(6,6);
Therm_Flags = zeros(1,3);

% Просмотр файла
while (~feof(Fin))
    
    % Чтение следующей строки
    string = fgets(Fin);
    
    % Чтение лоадкейса
    position = strfind(string, 'O U T P U T   F O R   L O A D   C A S E');
    
    if (~isempty(position))
        Load_Case = strtrim(string(position+39:length(string)));
    end
    
    % Чтение шага
    position_2 = strfind(string, 'S T A T I C   A N A L Y S I S');
    
    if (~isempty(position_2))
        position_1 = strfind(string, 'S T E P');
        if (~isempty(position_1))
            Step = strtrim(string(position_1+7:position_2-1));
        end
    end
    
    % Если начинается вывод результатов для узлов
    if (~isempty(strfind(string, 'N O D E   O U T P U T'))) %#ok<STREMP>
        
        % Ветвление по номеру шага
        switch Step
            
            case '1'
                
                % Ветвление по лоадкейсу
                switch Load_Case
                    case 'LOAD0'
                        index = 1;
                    case 'LOAD1'
                        index = 2;
                    case 'LOAD2'
                        index = 3;
                    case 'LOAD3'
                        index = 4;
                    case 'LOAD4'
                        index = 5;
                    case 'LOAD5'
                        index = 6;
                    otherwise
                        fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                end
                
                % Чтение результатов для CONSTRAINTSDRIVER0 - CONSTRAINTSDRIVER5
                for i=1:6
                    
                    pattern = sprintf('THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET ASSEMBLY_CONSTRAINTSDRIVER%i', i-1);
                    
                    while (~feof(Fin))

                        string = fgets(Fin);

                        if (~isempty(strfind(string, pattern))) %#ok<STREMP>

                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin);

                            if (~isempty(strfind(string, 'ALL VALUES IN THIS TABLE ARE ZERO'))) %#ok<STREMP>
                                Mech_Flags(index,i) = 1;
                                break;
                            else

                                temp_cell_array = strsplit(strtrim(string), {' ', '\t'});

                                if ((~isempty(temp_cell_array)) && (numel(temp_cell_array) >= 2))

                                    tmp_number = str2double(temp_cell_array{2});

                                    if (~isnan(tmp_number))
                                        Mech_Flags(index,i) = 1;
                                        Mech_Results(index,i) = tmp_number;
                                        break;
                                    else
                                        fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                                        ErrCode = -1;
                                        fclose(Fin);
                                        return;
                                    end

                                else
                                    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                                    ErrCode = -1;
                                    fclose(Fin);
                                    return;
                                end

                            end

                        end

                    end
                    
                end
                
            case '2'
                
                % Чтение результатов для CONSTRAINTSDRIVER0 - CONSTRAINTSDRIVER2
                for i=1:3
                    
                    pattern = sprintf('THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET ASSEMBLY_CONSTRAINTSDRIVER%i', i-1);
                    
                    while (~feof(Fin))

                        string = fgets(Fin);

                        if (~isempty(strfind(string, pattern))) %#ok<STREMP>

                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin); %#ok<NASGU>
                            string = fgets(Fin);

                            if (~isempty(strfind(string, 'ALL VALUES IN THIS TABLE ARE ZERO'))) %#ok<STREMP>
                                Therm_Flags(1,i) = 1;
                                break;
                            else

                                temp_cell_array = strsplit(strtrim(string), {' ', '\t'});

                                if ((~isempty(temp_cell_array)) && (numel(temp_cell_array) >= 2))

                                    tmp_number = str2double(temp_cell_array{2});

                                    if (~isnan(tmp_number))
                                        Therm_Flags(1,i) = 1;
                                        Therm_Results(1,i) = tmp_number;
                                        break;
                                    else
                                        fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                                        ErrCode = -1;
                                        fclose(Fin);
                                        return;
                                    end

                                else
                                    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                                    ErrCode = -1;
                                    fclose(Fin);
                                    return;
                                end

                            end

                        end

                    end
                    
                end
                
            otherwise
                
                fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
                ErrCode = -1;
                fclose(Fin);
                return;
            
        end
        
    end
    
end

% Закрытие файла
fclose(Fin);

% Проверка
tmp_sum = 0;

for i=1:size(Mech_Flags,1)
    for j=1:size(Mech_Flags,2)
        tmp_sum = tmp_sum + Mech_Flags(i,j);
    end
end

if (tmp_sum ~= 36)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

tmp_sum = 0;

for i=1:size(Therm_Flags,1)
    for j=1:size(Therm_Flags,2)
        tmp_sum = tmp_sum + Therm_Flags(i,j);
    end
end

if (tmp_sum ~= 3)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(1,1) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(2,2) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(3,3) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(4,4) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(5,5) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

if (Mech_Results(6,6) == 0)
    fprintf (1, '\nОшибка чтения файла [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

% Вычисление эффективных свойств
Properties.E1 = 1 / Mech_Results(1,1);
Properties.E2 = 1 / Mech_Results(2,2);
Properties.E3 = 1 / Mech_Results(3,3);
Properties.G12 = 1 / Mech_Results(4,4);
Properties.G13 = 1 / Mech_Results(5,5);
Properties.G23 = 1 / Mech_Results(6,6);
Properties.Nu12 = -Mech_Results(1,2) / Mech_Results(1,1);
Properties.Nu13 = -Mech_Results(1,3) / Mech_Results(1,1);
Properties.Nu23 = -Mech_Results(2,3) / Mech_Results(2,2);
Properties.alpha11 = Therm_Results(1,1);
Properties.alpha22 = Therm_Results(1,2);
Properties.alpha33 = Therm_Results(1,3);
